package cl.tinet.trainee.proyecto.mb;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import cl.tinet.trainee.proyecto.ejb.InterfazLoginBean;
import cl.tinet.trainee.proyecto.excepciones.MiException;
import cl.tinet.trainee.proyecto.modelo.Usuario;

/**
 * 
 * LoginManagedBean verifica el login y administra la session del usuario.
 * 
 * @author Jose Palma.
 */
@ManagedBean
@SessionScoped
public class LoginManagedBean implements Serializable {
    /**
     * serialVersion 1.0.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Usuario ingresado en el sistema.
     */
    private Usuario usuarioLogueado;

    /**
     * Log de la clase.
     */
    private static final Logger LOG = Logger.getLogger(LoginManagedBean.class);

    /**
     * Bean de usuario.
     */
    @EJB(mappedName = "loginBean", name = "loginBean")
    private transient InterfazLoginBean bean;
    /**
     * 
     */
    private String message;

    /**
     * Genera una nueva sala despues de llamar al constructor.
     */
    @PostConstruct
    public void init() {
        if (this.usuarioLogueado == null) {
            this.usuarioLogueado = new Usuario();
        }
    }

    /**
     * 
     * Envia el usuario ingresado al Bean del login para su validacion y luego
     * redirecciona a la pagina que corresponda por el tipo de usuario.
     * 
     * @return destino Pagina a donde se ira despues de la validacion.
     */
    public String verificarSession() {
        String destino = "login";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            this.usuarioLogueado = bean.verificaLogin(this.usuarioLogueado);
        } catch (MiException e) {
            LOG.error("loginMB: ", e);
            context.addMessage(null,
                    new FacesMessage("Error", "Alerta: " + e.getCodigo()));
            return destino;
        }
        context.addMessage(null, new FacesMessage("Exito", "Bienvenido: "
                + this.usuarioLogueado.getNombre()));
        // verifica el tipo de usuario true admin, false normal
        if (this.usuarioLogueado.getEstado()) {
            if (this.usuarioLogueado.getTipoUsuario()) {
                destino = "menuAdmin";
            } else {
                destino = "menuNormal";
            }
        }
        return destino;
    }

    /**
     * 
     * Elimina la session y redirecciona a login.
     * 
     * @return pagina a la que redirecciona.
     */
    public String cerrarSession() {
        return "login";
    }

    /**
     * 
     * Growl.
     * 
     * @param msg
     *            String.
     */
    public void saveMessage(String msg) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Your message: "
                + msg));
    }

    /**
     * Allows to get the message attribute value.
     * 
     * @return the message value.
     */
    public String getMessage() {
        return message;
    }

    /**
     * Allows to set the message attribute value.
     * 
     * @param message
     *            new value for message attribute.
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * Genera una nueva instancia de usuario.
     * 
     */
    public void limpiar() {
        this.usuarioLogueado = new Usuario();
    }

    /**
     * Allows to get the usuarioLogueado attribute value.
     * 
     * @return the usuarioLogueado value.
     */
    public Usuario getUsuarioLogueado() {
        return usuarioLogueado;
    }

    /**
     * Allows to set the usuarioLogueado attribute value.
     * 
     * @param usuarioLogueado
     *            new value for usuarioLogueado attribute.
     */
    public void setUsuarioLogueado(Usuario usuarioLogueado) {
        this.usuarioLogueado = usuarioLogueado;
    }

    /**
     * 
     * logout method.
     * 
     * @return redirecciona a login
     */
    public String logout() {
        HttpSession session =
                (HttpSession) FacesContext.getCurrentInstance()
                        .getExternalContext().getSession(false);
        session.invalidate();
        return "login.jsp";
    }

}
